#pragma once

#include <QString>
#include <QVariant>
#include <QHash>
#include <memory>
#include <functional>

namespace infrastructure {

/**
 * @brief 配置数据键值对的结构
 */
struct ConfigurationData {
    QHash<QString, QVariant> values;
};

/**
 * @brief 配置变更回调函数类型
 * @param key 变更的配置键
 * @param newValue 新的值
 */
using ConfigurationChangeCallback = std::function<void(const QString& key, const QVariant& newValue)>;

/**
 * @class IConfigurationProvider
 * @brief 配置提供者的基接口，所有配置源都需要实现此接口
 */
class IConfigurationProvider {
public:
    virtual ~IConfigurationProvider() = default;

    /**
     * @brief 从配置源加载配置数据
     * @return ConfigurationData 加载的配置数据
     */
    virtual ConfigurationData load() = 0;

    /**
     * @brief 检查配置源是否可用
     * @return bool 如果配置源可用则返回true
     */
    virtual bool isAvailable() const = 0;

    /**
     * @brief 获取配置提供者的描述信息
     * @return QString 描述信息
     */
    virtual QString getDescription() const = 0;

    /**
     * @brief 设置配置变更回调
     * @param callback 配置变更时的回调函数
     */
    virtual void setChangeCallback(ConfigurationChangeCallback callback) = 0;

    /**
     * @brief 开始监视配置变更
     */
    virtual void startWatching() = 0;

    /**
     * @brief 停止监视配置变更
     */
    virtual void stopWatching() = 0;

    /**
     * @brief 获取配置提供者的优先级
     * @return int 优先级，数值越高优先级越高
     */
    virtual int getPriority() const = 0;
};

} // namespace infrastructure 